#include <iostream>
#include <string>
#include <vector>
#include <functional>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdlib.h>

using namespace std;

uint64_t count = 0;

typedef function<void()> func;
vector<func> callbacks;

void showCount()
{
    cout << "final count : " << count << endl;
}
void showLog()
{
    cout << "这个是日志功能" << endl;
}
void logUser()
{
    if (fork() == 0)
    {
        execl("/usr/bin/who", "who", nullptr);
        exit(1);
    }
    wait(nullptr);
}

// 定时器功能
void catchsig(int signum)
{
    // cout<<"count:"<<count<<endl;

    for (auto &f : callbacks)
    {
        f();
    }
    alarm(1);
}

void handler(int signum)
{
    sleep(1);
    cout << "获得了一个信号: " << signum << endl;
}

//./mykill -2 pid
int main(int argc, char *argv[])
{
    // signal(2,handler);    // 特定信号的处理动作，一般只有一个
    // signal(3,handler);  //ctrl+\;
    // signal(20,handler); //ctrl+z;
    //  signal函数，仅仅是修改进程对特定信号的后续处理动作，不是直接调用对应的处理动作
    // 如果后续没有任何SIGINT信号产生，handler会不会被调用？？永远也不会被调用

    // cout<<"i am runing..."<<endl;
    // sleep(3);
    // abort();// 通常用来进行终止进程！与exit，return类似
    //  raise(8); // raise(6) kill(getpid(), 6)

    // signal(SIGALRM,catchsig); //cout + 网络发送 = IO 累加值只有1w左右
    //  alarm(1); // 设定了一个闹钟，这个闹钟一旦触发，就自动移除了

    // callbacks.push_back(showCount);
    // callbacks.push_back(showLog);
    // callbacks.push_back(logUser);

    // while(true)count++;

    //signal(8,handler);

     signal(SIGSEGV, handler);
     int *p = nullptr;
    *p = 100;
    while(true)sleep(1);

    // while (true)
    // {
    //     sleep(1);
    //     int i = 100;
    //     i /= 0;

    //     //  cout << "我是一个进程，我正在运行..., Pid: " << getpid() << endl;
    //     //  sleep(1);

    //     // cout<<"i am runing..."<<endl;
    //     // sleep(3);
    //     //  int i=100;
    //     //  i/=0;
    // }

    // pid_t id=fork();
    // if(id==0)
    // {
    //     //子进程

    //     sleep(1);
    //     int i=100;
    //     i/=0;
    // }

    // //父进程
    // int status=0;
    // waitpid(id,&status,0);
    // cout << "父进程：" << getpid() << " 子进程：" << id << \ 
    // " exit sig: " << (status & 0x7F) << " is core: " << ((status >> 7) & 1) << endl;

    return 0;
}
